package dp.prototype.register;


/**
 * 
登记形式的原型模式

作为原型模式的第二种形式，它多了一个原型管理器(PrototypeManager)角色，
该角色的作用是：创建具体原型类的对象，并记录每一个被创建的对象。
 *
 */
public class Client {
	public static void main(String[] args) {
		try {
			Prototype p1 = new ConcretePrototype1();
			PrototypeManager.setPrototype("p1", p1);
			// 获取原型来创建对象
			Prototype p3 = PrototypeManager.getPrototype("p1").clone();
			p3.setName("张三");
			System.out.println("第一个实例：" + p3);
			
			// 有人动态的切换了实现
			Prototype p2 = new ConcretePrototype2();
			PrototypeManager.setPrototype("p1", p2);
			
			// 重新获取原型来创建对象
			Prototype p4 = PrototypeManager.getPrototype("p1").clone();
			p4.setName("李四");
			System.out.println("第二个实例：" + p4);
			
			// 有人注销了这个原型
			PrototypeManager.removePrototype("p1");
			
			// 再次获取原型来创建对象
			Prototype p5 = PrototypeManager.getPrototype("p1").clone();
			p5.setName("王五");
			System.out.println("第三个实例：" + p5);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
